AWS CDKのv2.55.0からAppSyncのAlphaモジュールで破壊的変更が入ったので修正してみた
はじめに
アノテーション の中野です。
プロジェクトの各ライブラリのアップデートを行っている際に、CDKのデプロイ時にエラーが発生しました。
原因として、CDKのAppSyncのAlphaモジュール(@aws-cdk/aws-appsync-alpha
)で、2.53.0-alpha.0
から2.59.0-alpha.0
の間のバージョンで破壊的変更が適用されていたためエラーが発生しました。
その際にドキュメントを読みながらコードに修正を加える必要がありましたので、実際に行った対応をご紹介します。
環境情報
- ライブラリ
@aws-cdk/aws-appsync-alpha
- バージョンアップ前
- バージョンアップ後
結論
@aws-cdk/aws-appsync-alpha
の2.55.0-alpha.0より破壊的変更が入ってモジュールの使い方が変わった@aws-cdk/aws-appsync-alpha
はv2.60.0からexperimental版からstable版へ移行できるようになったことで、aws-cdk-lib
に含まれるようになった
エラーメッセージ
私の環境ではcdk deploy
時に、2種類のエラーを確認しました。
1. Schemaプロパティが存在しない
error TS2339: Property 'Schema' does not exist on type 'typeof import("/*****/node_modules/@aws-cdk/aws-appsync-alpha/lib/index")'. schema: appsync.Schema.fromAsset('../schema.graphql'),
このエラーメッセージは、AppSyncのAlphaモジュールにSchema
というプロパティは存在しないという意味です。
2. createResolverの引数は2つである必要がある
error TS2554: Expected 2 arguments, but got 1. datasource.createResolver({ ~~~~~~~~~~~~~~~~ typeName: 'Query', ~~~~~~~~~~~~~~~~~~~~~~ fieldName: 'fieldName', ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }) ~~~~
こちらのエラーメッセージでは、createResolver
の引数はこれまで一つでもよかったのですが、v2.55.0から2つの引数が必要ということを意味しています。
エラー原因
発生したエラーは、どこかのバージョンアップでコードの書き方の変更が入ったのだろうと推測しました。
そこで、AWS CDKのGitHubのリリースノートを確認してみることにしました。
すると、v2.55.0よりAppSyncのAlphaモジュールで破壊的な変更が適用されていました。
https://github.com/aws/aws-cdk/releases/tag/v2.55.0
BREAKING CHANGES TO EXPERIMENTAL FEATURES - appsync:
DataSource.createResolver
,DataSource.createFunction
, andGraphQlApi.createResolver
now require2 arguments instead of 1. - appsync: RenamesSchema
toSchemaFile
that implementsISchema
. Removes alladdXxx
type methods fromGraphQlApi
.
上記、リリースノートの通り
Schema
はSchemaFile
へ変更する必要があるDataSource.createResolver
、DataSource.createFunction
、GraphQlApi.createResolver
は、2 つの引数が必要になった
とのことです。
修正したコード
「1. Schemaプロパティが存在しない」に対するコードの修正は以下の様に行いました。
- Before
import * as appsync from '@aws-cdk/aws-appsync-alpha' appsync.Schema.fromAsset('../schema.graphql')
- After
import * as appsync from '@aws-cdk/aws-appsync-alpha' appsync.SchemaFile.fromAsset('../schema.graphql')
「2. createResolverの引数は2つである必要がある」に対するコードの修正は以下の様に行いました。
- Before
datasource.createResolver( { typeName: 'Query', fieldName: 'fieldName', } )
- After
datasource.createResolver( 'QueryFieldNameResolver', // <- ADD: Resolverに指定するidを追加 { typeName: 'Query', fieldName: 'fieldName', } )
躓いたポイントと修正点
AppSync論理ID関連のエラー
上述の様に修正してから、cdk deploy
実行後に CloudFormation 上でエラーが発生しました。
- CloudFormation エラーメッセージ
Only one resolver is allowed per field. (Service: AWSAppSync; Status Code: 400; Error Code: BadRequestException
こちらの原因についてGitHub Issueで調査しました。
私の修正したコードだと、古いリゾルバが削除されて、新しいリゾルバが作成されるときに論理IDが新たなものに置き換えられる挙動となりました。
この挙動によって、重複して同じ論理IDのものをCloudFormationが作ろうとすることでエラーとなることが報告されています。
参照: (aws-appsync): resolver replacement issues #issuecomment-1358835318
既存論理IDを利用するようにコード修正
GitHub Issueで報告されている回避策だと、論理IDは既存のリゾルバのものを使うことで、置き換えが発生せずにCloudFormation上でのエラーは回避できるとのことです。
参照: (aws-appsync): resolver replacement issues #issuecomment-1363154755
実際に以下のように修正したことで、エラーを回避しリゾルバの置き換えも発生しませんでした。
AppSyncモジュールのcreateResolver
というメソッドではなく、Resolver
というクラスを使うようにコードを変更しています。
- Before
datasource.createResolver( 'QueryFieldNameResolver', { typeName: 'Query', fieldName: 'fieldName', } )
- After
const resolverId = 'QueryFieldNameResolver' new Resolver(dataSource, resolverId, { // <- resolverIdに既存リゾルバの論理IDを指定 api: api dataSource: dataSource typeName: 'Query', fieldName: 'fieldName', })
[補足] Alphaモジュールを安定版へ移行
実は、この対応している間にCDKのv2.60.0がリリースされました。
v2.60.0の変更点として、AppSyncのAlphaモジュールが実験版(experimental)から安定版(stable)へと移行していました。
この変更で、今まで実験版のモジュールのインポートはAlphaモジュールからやっていたものが、aws-cdk-lib
からインポートできるようになっています。
そのため、以下のようにAlphaモジュールをインポートしている箇所を安定版の方に差し替えても、コードは以前と同様に動作することを確認しました。
前提として、CDK をv1からv2へ移行後に、継続して同様のモジュールを利用するために、Alphaモジュールを使われていたプロジェクトもあるかと思います。
そのような場合は、これを期に安定版に移行してみてもよいかと思います。
- Before
import * as appsync from '@aws-cdk/aws-appsync-alpha'
- After
import * as appsync from 'aws-cdk-lib/aws-appsync'
さいごに
CDKで@aws-cdk/aws-appsync-alpha
を利用していた方が、バージョンアップした際に躓いた場合の助けになると幸いです。
参考情報
- Release v2.55.0 · aws/aws-cdk
- Experimental construct librariesがAWS CDK v2で利用可能になりました | Amazon Web Services ブログ
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。